package controller;

import dao.MatriculadoJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Aluno;
import model.Disciplina;
import model.DisciplinaProfessor;
import model.Matriculado;
import model.Turma;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class MatriculadoController extends Controller {

    public MatriculadoController() {
        if (JsfUtil.getObjectFromSession("MatriculadoJpaController") == null) {
            jpaController = new MatriculadoJpaController();
        } else {
            jpaController = (MatriculadoJpaController) JsfUtil.getObjectFromSession("MatriculadoJpaController");
        }
    }
    private Matriculado matriculado = null;
    private Matriculado matriculadoAux = null;
    private MatriculadoJpaController jpaController = null;
    private List<Matriculado> matriculados = null;
    private Turma turma;
    private Aluno aluno;
    private DisciplinaProfessor disciplinaProfessor;
    private List<Turma> turmas;
    private Boolean showDialog;
    private List<DisciplinaProfessor> disciplinaProfessors;

    public void clear() {
        //aluno = null;
        matriculado = null;
        matriculados = null;
        disciplinaProfessors = null;
        disciplinaProfessor = null;
    }

    public String setModalMatriculaCad() {
        if (getDisciplinaProfessors() == null || getDisciplinaProfessors().size() == 0) {
            JsfUtil.addErrorMessage("Cadastre Disciplina Primeiro");
            getDisciplinaProfessorController().setPageDisciplinaCad();
            return "refreshPage";
        }

        if (getTurmas() == null || getTurmas().size() == 0) {
            JsfUtil.addErrorMessage("Cadastre Turmas Primeiro");
            getPageManager().setPageTurmaCad();
            return "refreshPage";
        }
        clear();
        getPageManager().setModalMatriculadoCad();
        return "refreshPage";
    }

    public String persiste() {
        if (matriculado.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {
            jpaController.edit(this.matriculado);
            matriculadoAux = matriculado;
            this.matriculado = null;
            JsfUtil.addSuccessMessage("Matriculado Atualizado com Sucesso");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(MatriculadoController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(MatriculadoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {

            getMatriculado().setAluno(getAluno());

            jpaController.create(getMatriculado());
            matriculadoAux = matriculado;
            matriculado = null;
            JsfUtil.addSuccessMessage("Matriculado cadastrado com sucesso.");
            getPageManager().setModalVisible(false);
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        Matriculado matriculadoTemp = (Matriculado) JsfUtil.getObjectFromRequestParameter("matriculado");
        this.matriculado = matriculadoTemp;
        return "refreshPage";
    }

    public String destroy() {
        Matriculado matriculadoTemp = (Matriculado) JsfUtil.getObjectFromRequestParameter("matriculado");
        try {
            jpaController.destroy(matriculadoTemp.getId());
            JsfUtil.addSuccessMessage("Matriculado removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(MatriculadoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public Matriculado getMatriculado() {
        if (matriculado == null) {
            matriculado = new Matriculado();
        }
        return matriculado;
    }

    public List<Matriculado> getMatriculados() {
        this.matriculados = jpaController.findMatriculadoEntities();
        return this.matriculados;
    }

    public MatriculadoJpaController getJpaController() {
        return jpaController;
    }

    public Matriculado getMatriculadoAux() {
        return matriculadoAux;
    }

    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null) {
            if (disciplinaProfessor == null) {
                disciplinaProfessor = getDisciplinaProfessors().get(0);
            }
        }
        return disciplinaProfessor;

    }

    public void setDisciplinaProfessor(DisciplinaProfessor disciplinaProfessor) {
        this.disciplinaProfessor = disciplinaProfessor;
    }

    public Turma getTurma() {
        if (turma == null) {
            turma = getTurmas().get(0);
        }
        return turma;
    }

    public void setTurma(Turma turma) {
        this.turma = turma;
    }

    public Aluno getAluno() {
        if (aluno == null) {
            aluno = getAlunoController().getAlunoAux();
        }
        if (aluno == null) {
            aluno = new Aluno();
        }
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public List<Turma> getTurmas() {
        turmas = getTurmaController().getTurmas(getDisciplinaProfessor());
        return turmas;
    }

    public void setTurmas(List<Turma> turmas) {
        this.turmas = turmas;
    }

    public boolean isShowDialog() {
        if (showDialog == null) {
            showDialog = false;
        }
        return showDialog;
    }

    public void setShowDialog(boolean showDialog) {
        this.showDialog = showDialog;
    }

    public void matricular() {


        getMatriculado().setTurma(turma);

        setAluno(getAlunoController().getAlunoAux());
        getMatriculado().setAluno(getAluno());
        showDialog = false;
        persiste();

    }

    public String loadAluno() {
        Aluno aluno = (Aluno) JsfUtil.getObjectFromRequestParameter("alunoTemp");
//        getAlunoController().setAlunoAux(aluno);
        setAluno(aluno);
        setModalMatriculaCad();
        return "refreshPage";
    }

    public List<Matriculado> getMatriculados(Turma turma) {
        return jpaController.findMatriculadoEntities(turma);
    }

    public List<Matriculado> getMatriculados(Aluno aluno) {
        return jpaController.findMatriculadoEntities(aluno);
    }

    public List<DisciplinaProfessor> getDisciplinaProfessors() {

        if (disciplinaProfessors == null) {
            disciplinaProfessors = new ArrayList<DisciplinaProfessor>();
            for (DisciplinaProfessor dp : getDisciplinaProfessorController().getDisciplinaProfessorLogado()) {
                List<Turma> ts = getTurmaController().getTurmas(dp);
                if (ts != null && ts.size() > 0) {
                    disciplinaProfessors.add(dp);
                }
            }
        }
        return disciplinaProfessors;
    }

    public void setDisciplinaProfessors(List<DisciplinaProfessor> disciplinaProfessors) {
        this.disciplinaProfessors = disciplinaProfessors;
    }
}
